package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import co.gov.medellin.ssti.sub.model.dao.IAuditoriaDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AreaVO;
import co.gov.medellin.ssti.sub.model.vo.AuditoriaVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

public class AuditoriaDAOImp extends BaseDAOImpl implements IAuditoriaDAO {

	public AuditoriaDAOImp(Connection con) {
		super(con);
	}

	public Collection<UserVO> findUsers(String cedula, String descripcion)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		StringBuffer query = new StringBuffer();
		List<Object> parameters = new ArrayList<Object>();
		Collection<UserVO> results = new ArrayList<UserVO>();

		query.append("SELECT codigo, nombre, SUBSTR(descripcion,1,30) descripcion "
				+ " FROM paoyer.TCS_USUARIO WHERE campo_a1 IS NULL ");
		if (cedula != null && !cedula.equalsIgnoreCase("")) {
			query.append(" AND nombre = ? ");
			parameters.add(cedula);
		}
		if (descripcion != null && !descripcion.equalsIgnoreCase("")) {
			query.append(" AND descripcion like UPPER(?) ");
			parameters.add("%" + descripcion + "%");
		}
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				UserVO user = new UserVO();
				user.setCode(new Long(rst.getLong("codigo")));
				user.setName(rst.getString("nombre"));
				user.setDescription(rst.getString("descripcion"));
				results.add(user);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return results;
	}

	public Collection<AuditoriaVO> findReporte(String tabla,
			String fechaCreaDesde, String fechaMofificaDesde,
			String fechaCreaHasta, String fechaMofificaHasta,
			String usuarioCrea, String usuarioModifica) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		StringBuffer query = new StringBuffer();
		List<Object> parameters = new ArrayList<Object>();

		query.append("SELECT "
				+ " tabla.USUARIO_CREA, TO_CHAR(tabla.FECHA_CREA,'DD/MM/RRRR') FECHA_CREA ,"
				+ " tabla.TERMINAL_CREA, tabla.USUARIO_MODIFICA, "
				+ " TO_CHAR(tabla.FECHA_MODIFICA,'DD/MM/RRRR') FECHA_MODIFICA, "
				+ " tabla.TERMINAL_MODIFICA, ");

		if (tabla.equals("TCS_BEN_BENEFICIARIO")) {
			query.append(" tabla.CODIGO, tabla.TIPO_DOCUMENTO,  tabla.NUMERO_DOCUMENTO, tabla.PRIMER_NOMBRE, "
					+ " tabla.SEGUNDO_NOMBRE, tabla.PRIMER_APELLIDO, tabla.SEGUNDO_APELLIDO "
					+ " FROM TCS_BEN_BENEFICIARIO tabla WHERE ROWNUM <= 100 ");
		} else if (tabla.equals("TCS_BEN_PROGRAMA")) {
			query.append(" tabla.CODIGO, area.NOMBRE area, usu.NOMBRE usuario, "
					+ " tabla.NOMBRE "
					+ " FROM TCS_BEN_PROGRAMA tabla, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu "
					+ " WHERE ROWNUM <= 100 "
					+ " AND area.CODIGO = tabla.AREA_CODIGO "
					+ " AND usu.CODIGO = tabla.USU_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SUBPROGRAMA")) {
			query.append(" tabla.CODIGO, tabla.NOMBRE, "
					+ " DECODE(tabla.VALIDAR_CONTRA_ESTUD,'S''Si','N','No') VALIDAR_CONTRA_ESTUD, "
					+ " DECODE(tabla.VALIDAR_CONTRA_SISBEN,'S''Si','N','No') VALIDAR_CONTRA_SISBEN, "
					+ " nvl(tabla.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
					+ " pro.NOMBRE programa, usu.NOMBRE usuario, area.NOMBRE area "
					+ " FROM TCS_BEN_SUBPROGRAMA tabla, TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu "
					+ " WHERE ROWNUM <= 100 "
					+ " AND area.CODIGO = tabla.AREA_CODIGO "
					+ " AND usu.CODIGO = tabla.USU_CODIGO "
					+ " AND pro.CODIGO = tabla.PRG_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SEDE")) {
			query.append(" tabla.CODIGO, tabla.NOMBRE, "
					+ " tabla.CARACTER, tabla.TIPO, vflex.NOMBRE municipio "
					+ " FROM TCS_BEN_SEDE tabla, paoyer.TCS_VALOR_FLEXIBLE vflex "
					+ " WHERE ROWNUM <= 100 "
					+ " AND vflex.CODIGO = tabla.VFL_CODIGO_MUNICIPIO ");
		} else if (tabla.equals("TCS_BEN_BENEFICIO_OTORGADO")) {
			query.append(" tabla.CODIGO, TO_CHAR(tabla.FECHA_BENEFICIO,'DD/MM/RRRR') FECHA_BENEFICIO, "
					+ " subpro.NOMBRE subprograma, "
					+ " ben.NUMERO_DOCUMENTO ||' | '|| ben.PRIMER_NOMBRE ||' '|| "
					+ " ben.SEGUNDO_NOMBRE ||' '||  ben.PRIMER_APELLIDO ||' '|| "
					+ " ben.SEGUNDO_APELLIDO beneficiario, sede.NOMBRE sede "
					+ " FROM TCS_BEN_BENEFICIO_OTORGADO tabla, TCS_BEN_BENEFICIARIO ben, TCS_BEN_SEDE sede, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE ROWNUM <= 100 "
					+ " AND ben.CODIGO = tabla.BEN_CODIGO "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO "
					+ " AND sede.CODIGO = tabla.SEDE_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SUBP_ATR_BENEFICIARIO")) {
			query.append(" tabla.CODIGO, tabla.NOMBRE, "
					+ " DECODE(tabla.TIPO_DATO,'A','Alfanumerico','F','Fecha','N','Numerico','L','Solo letras') TIPO_DATO, "
					+ " DECODE(tabla.OBLIGATORIO,'S','Si','N','No') OBLIGATORIO, "
					+ " subpro.NOMBRE subprograma "
					+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO tabla, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE ROWNUM <= 100 "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SUBPROGRAMA_SEDE")) {
			query.append(" tabla.CODIGO, TO_CHAR(tabla.DESDE,'DD/MM/RRRR') DESDE, "
					+ " TO_CHAR(tabla.HASTA,'DD/MM/RRRR') HASTA, "
					+ " tabla.NUMERO_BENEFICIO, tabla.NUMERO_BEN_DISPONIBLE, "
					+ " sede.NOMBRE sede, subpro.NOMBRE subprograma "
					+ " FROM TCS_BEN_SUBPROGRAMA_SEDE tabla, TCS_BEN_SEDE sede, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE ROWNUM <= 100 "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO "
					+ " AND sede.CODIGO = tabla.SEDE_CODIGO ");
		}

		if (!fechaCreaDesde.equalsIgnoreCase("")
				&& !fechaCreaHasta.equalsIgnoreCase("")) {
			query.append(" AND tabla.FECHA_CREA BETWEEN TO_DATE(?,'DD/MM/RRRR') AND TO_DATE(?,'DD/MM/RRRR')");
			parameters.add(fechaCreaDesde);
			parameters.add(fechaCreaHasta);
		}
		if (!fechaMofificaDesde.equalsIgnoreCase("")
				&& !fechaMofificaHasta.equalsIgnoreCase("")) {
			query.append(" AND tabla.FECHA_MODIFICA BETWEEN TO_DATE(?,'DD/MM/RRRR') AND TO_DATE(?,'DD/MM/RRRR')");
			parameters.add(fechaMofificaDesde);
			parameters.add(fechaMofificaHasta);
		}
		if (!usuarioCrea.equalsIgnoreCase("")) {
			query.append(" AND tabla.USUARIO_CREA = ? ");
			parameters.add(usuarioCrea);
		}
		if (!usuarioModifica.equalsIgnoreCase("")) {
			query.append(" AND tabla.USUARIO_MODIFICA = ? ");
			parameters.add(usuarioModifica);
		}
		query.append(" ORDER BY tabla.codigo DESC ");

		Collection<AuditoriaVO> reporte = new LinkedList<AuditoriaVO>();

		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				AuditoriaVO objReporte = new AuditoriaVO();
				objReporte.setUsuarioCrea(rst.getString("USUARIO_CREA"));
				objReporte.setFechaCrea(rst.getString("FECHA_CREA"));
				objReporte.setTerminalCrea(rst.getString("TERMINAL_CREA"));
				objReporte
						.setUsuarioModifica(rst.getString("USUARIO_MODIFICA"));
				objReporte.setFechaModifica(rst.getString("FECHA_MODIFICA"));
				objReporte.setTerminalModifica(rst
						.getString("TERMINAL_MODIFICA"));
				if (tabla.equals("TCS_BEN_BENEFICIARIO")) {
					objReporte.setColumna1(rst.getString("CODIGO"));
					objReporte.setColumna2(rst.getString("TIPO_DOCUMENTO"));
					objReporte.setColumna3(rst.getString("NUMERO_DOCUMENTO"));
					objReporte.setColumna4(rst.getString("PRIMER_NOMBRE"));
					objReporte.setColumna5(rst.getString("SEGUNDO_NOMBRE"));
					objReporte.setColumna6(rst.getString("PRIMER_APELLIDO"));
					objReporte.setColumna7(rst.getString("SEGUNDO_APELLIDO"));
				} else if (tabla.equals("TCS_BEN_PROGRAMA")) {
					objReporte.setColumna1(rst.getString("CODIGO"));
					objReporte.setColumna2(rst.getString("NOMBRE"));
					objReporte.setColumna4(rst.getString("AREA"));
					objReporte.setColumna5(rst.getString("USUARIO"));
				} else if (tabla.equals("TCS_BEN_SUBPROGRAMA")) {
					objReporte.setColumna1(rst.getString("CODIGO"));
					objReporte.setColumna2(rst.getString("NOMBRE"));
					objReporte.setColumna3(rst.getString("PROGRAMA"));
					objReporte.setColumna4(rst.getString("USUARIO"));
					objReporte.setColumna5(rst.getString("AREA"));
					objReporte.setColumna6(rst
							.getString("VALIDAR_CONTRA_ESTUD"));
					objReporte.setColumna7(rst
							.getString("VALIDAR_CONTRA_SISBEN"));
					objReporte.setColumna8(rst
							.getString("VALOR_UNITARIO_BENEFICIO"));

				} else if (tabla.equals("TCS_BEN_SEDE")) {
					objReporte.setColumna1(rst.getString("CODIGO"));
					objReporte.setColumna2(rst.getString("NOMBRE"));
					objReporte.setColumna3(rst.getString("MUNICIPIO"));
					objReporte.setColumna4(rst.getString("CARACTER"));
					objReporte.setColumna5(rst.getString("TIPO"));

				} else if (tabla.equals("TCS_BEN_BENEFICIO_OTORGADO")) {
					objReporte.setColumna1(rst.getString("CODIGO"));
					objReporte.setColumna2(rst.getString("SUBPROGRAMA"));
					objReporte.setColumna3(rst.getString("BENEFICIARIO"));
					objReporte.setColumna4(rst.getString("SEDE"));
					objReporte.setColumna5(rst.getString("FECHA_BENEFICIO"));

				} else if (tabla.equals("TCS_BEN_SUBP_ATR_BENEFICIARIO")) {
					objReporte.setColumna1(rst.getString("CODIGO"));
					objReporte.setColumna2(rst.getString("NOMBRE"));
					objReporte.setColumna3(rst.getString("SUBPROGRAMA"));
					objReporte.setColumna4(rst.getString("TIPO_DATO"));
					objReporte.setColumna5(rst.getString("OBLIGATORIO"));

				} else if (tabla.equals("TCS_BEN_SUBPROGRAMA_SEDE")) {
					objReporte.setColumna1(rst.getString("CODIGO"));
					objReporte.setColumna2(rst.getString("SEDE"));
					objReporte.setColumna3(rst.getString("SUBPROGRAMA"));
					objReporte.setColumna4(rst.getString("DESDE"));
					objReporte.setColumna5(rst.getString("HASTA"));
					objReporte.setColumna6(rst.getString("NUMERO_BENEFICIO"));
					objReporte.setColumna7(rst
							.getString("NUMERO_BEN_DISPONIBLE"));
				}
				reporte.add(objReporte);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return reporte;
	}

	public Long findCantidadRegistros(String tabla, String fechaCreaDesde,
			String fechaMofificaDesde, String fechaCreaHasta,
			String fechaMofificaHasta, String usuarioCrea,
			String usuarioModifica) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		StringBuffer query = new StringBuffer();
		List<Object> parameters = new ArrayList<Object>();

		query.append("SELECT COUNT(1) Cantidad ");

		if (tabla.equals("TCS_BEN_BENEFICIARIO")) {
			query.append(" FROM TCS_BEN_BENEFICIARIO tabla WHERE 1 = 1 ");
		} else if (tabla.equals("TCS_BEN_PROGRAMA")) {
			query.append(" FROM TCS_BEN_PROGRAMA tabla, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu "
					+ " WHERE 1 = 1 "
					+ " AND area.CODIGO = tabla.AREA_CODIGO "
					+ " AND usu.CODIGO = tabla.USU_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SUBPROGRAMA")) {
			query.append(" FROM TCS_BEN_SUBPROGRAMA tabla, TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu "
					+ " WHERE 1 = 1 "
					+ " AND area.CODIGO = tabla.AREA_CODIGO "
					+ " AND usu.CODIGO = tabla.USU_CODIGO "
					+ " AND pro.CODIGO = tabla.PRG_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SEDE")) {
			query.append("FROM TCS_BEN_SEDE tabla, paoyer.TCS_VALOR_FLEXIBLE vflex "
					+ " WHERE 1 = 1 "
					+ " AND vflex.CODIGO = tabla.VFL_CODIGO_MUNICIPIO ");
		} else if (tabla.equals("TCS_BEN_BENEFICIO_OTORGADO")) {
			query.append(" FROM TCS_BEN_BENEFICIO_OTORGADO tabla, TCS_BEN_BENEFICIARIO ben, TCS_BEN_SEDE sede, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE 1 = 1 "
					+ " AND ben.CODIGO = tabla.BEN_CODIGO "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO "
					+ " AND sede.CODIGO = tabla.SEDE_CODIGO ");

		} else if (tabla.equals("TCS_BEN_SUBP_ATR_BENEFICIARIO")) {
			query.append(" FROM TCS_BEN_SUBP_ATR_BENEFICIARIO tabla, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE 1 = 1 "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO ");
		} else if (tabla.equals("TCS_BEN_SUBPROGRAMA_SEDE")) {
			query.append("FROM TCS_BEN_SUBPROGRAMA_SEDE tabla, TCS_BEN_SEDE sede, TCS_BEN_SUBPROGRAMA subpro "
					+ " WHERE 1 = 1 "
					+ " AND subpro.CODIGO = tabla.SBPR_CODIGO "
					+ " AND sede.CODIGO = tabla.SEDE_CODIGO ");
		}

		if (!fechaCreaDesde.equalsIgnoreCase("")
				&& !fechaCreaHasta.equalsIgnoreCase("")) {
			query.append(" AND tabla.FECHA_CREA BETWEEN TO_DATE(?,'DD/MM/RRRR') AND TO_DATE(?,'DD/MM/RRRR')");
			parameters.add(fechaCreaDesde);
			parameters.add(fechaCreaHasta);
		}
		if (!fechaMofificaDesde.equalsIgnoreCase("")
				&& !fechaMofificaHasta.equalsIgnoreCase("")) {
			query.append(" AND tabla.FECHA_MODIFICA BETWEEN TO_DATE(?,'DD/MM/RRRR') AND TO_DATE(?,'DD/MM/RRRR')");
			parameters.add(fechaMofificaDesde);
			parameters.add(fechaMofificaHasta);
		}
		if (!usuarioCrea.equalsIgnoreCase("")) {
			query.append(" AND tabla.USUARIO_CREA = ? ");
			parameters.add(usuarioCrea);
		}
		if (!usuarioModifica.equalsIgnoreCase("")) {
			query.append(" AND tabla.USUARIO_MODIFICA = ? ");
			parameters.add(usuarioModifica);
		}
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				return new Long(rst.getLong("Cantidad"));
			} else {
				throw new SQLException("No se encontraron registros.");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<AreaVO> selectSecretaria(int iCodeUser,
			String strGroupUser) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		if (strGroupUser == null || strGroupUser.isEmpty()) {
			throw new DAOException("El grupo del usuario no puede ser vacio.");
		}

		StringBuffer query = new StringBuffer();
		List<Object> parameters = new ArrayList<Object>();

		if (strGroupUser.equals("ADMINISTRADOR GENERAL")
				|| strGroupUser.equals("SUPER USUARIO")) {
			query.append("SELECT distinct area.CODIGO CODIGO, area.NOMBRE NOMBRE "
					+ " FROM tcs_ben_area area "
					+ " WHERE area.AREA_CODIGO is null ");
		} else {
			query.append("SELECT distinct area.CODIGO CODIGO, area.NOMBRE NOMBRE "
					+ " FROM tcs_ben_area area, paoyer.tcs_usuario usu "
					+ " WHERE usu.CAMPO_N1 = area.CODIGO ");
		}

		if (!strGroupUser.equals("ADMINISTRADOR GENERAL")
				&& !strGroupUser.equals("SUPER USUARIO")) {
			query.append(" AND usu.CODIGO = ? ");
			parameters.add(new Integer(iCodeUser));
		}
		query.append(" ORDER BY area.NOMBRE ");

		ArrayList<AreaVO> result = new ArrayList<AreaVO>();
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			AreaVO area = null;
			while (rst.next()) {
				area = new AreaVO();
				area.setCodearea(rst.getString("CODIGO"));
				area.setNombre(rst.getString("NOMBRE"));
				result.add(area);
				area = null;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return result;
	}

	public Collection<UserVO> findUserAdm(String strNameGroup, Long lCodeArea,
			String strNameUser, String strFind) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		ArrayList<UserVO> userAdmin = new ArrayList<UserVO>();
		StringBuffer query = new StringBuffer(
				"SELECT usu.CODIGO, usu.NOMBRE, usu.DESCRIPCION "
						+ " FROM paoyer.tcs_usuario usu "
						+ " WHERE Fcs_Val_Est_Vigencia(usu.VIGENCIA) = 'S' ");
		List<Object> parameters = new ArrayList<Object>();

		if (lCodeArea != null && lCodeArea.longValue() != 0) {
			query.append("AND usu.CAMPO_N1 = ? ");
			parameters.add(lCodeArea);
		} else {
			if (!strNameGroup.equals("ADMINISTRADOR GENERAL")
					&& !strNameGroup.equals("SUPER USUARIO")) {
				query.append(" AND usu.CAMPO_N1 = ? ");
				parameters.add(lCodeArea);
			} else {
				if (!strNameGroup.equals("ADMINISTRADOR GENERAL")
						&& !strNameGroup.equals("SUPER USUARIO")) {
					if (lCodeArea != null && lCodeArea.longValue() != 0) {
						query.append(" AND usu.CAMPO_N1 = ? ");
						parameters.add(lCodeArea);
					}
				}
			}
		}

		if (strFind != null && strFind.equals("nombre")) {
			if (strNameUser != null && !strNameUser.equals("")) {
				query.append(" AND usu.NOMBRE LIKE UPPER(?) ");
				parameters.add("%" + strNameUser + "%");
			}
		} else {
			if (strNameUser != null && !strNameUser.equals("")) {
				query.append(" AND usu.DESCRIPCION LIKE UPPER(?) ");
				parameters.add("%" + strNameUser + "%");
			}
		}
		query.append(" ORDER BY NOMBRE");
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			UserVO objUserVO = null;
			while (rst.next()) {
				objUserVO = new UserVO();
				objUserVO.setCode(new Long(rst.getInt("CODIGO")));
				objUserVO.setName(rst.getString("NOMBRE"));
				objUserVO.setDescription(rst.getString("DESCRIPCION"));
				userAdmin.add(objUserVO);
				objUserVO = null;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return userAdmin;
	}

	public Collection<AuditoriaVO> findReportControl(SubprogramaVO criteria)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List<Object> parameters = new ArrayList<Object>();
		StringBuffer query = new StringBuffer(
				"SELECT area.NOMBRE SECRETARIA, prog.NOMBRE NOMPRO, sub.NOMBRE NOMSUB, "
						+ "(SELECT COUNT(1) FROM tcs_ben_beneficio_otorgado bot "
						+ " WHERE bot.SBPR_CODIGO = sub.CODIGO "
						+ " AND bot.USUARIO_CREA = ?) CANTIDAD "
						+ " FROM tcs_ben_programa prog, tcs_ben_subprograma sub, tcs_ben_area area "
						+ " WHERE prog.CODIGO = sub.PRG_CODIGO "
						+ " AND area.CODIGO = prog.AREA_CODIGO "
						+ " AND sub.CODIGO in (SELECT bot.SBPR_CODIGO "
						+ "      FROM tcs_ben_beneficio_otorgado bot "
						+ "      WHERE bot.USUARIO_CREA = ? ");

		parameters.add(criteria.getNombreUsuario());
		parameters.add(criteria.getNombreUsuario());

		if (!criteria.getDesdeVigencia().equals("")
				&& !criteria.getHastaVigencia().equals("")) {
			query.append(" AND bot.FECHA_CREA >= TO_DATE(?,'DD/MM/RRRR') AND bot.FECHA_CREA < TO_DATE(?,'DD/MM/RRRR')) ");
			parameters.add(criteria.getDesdeVigencia());
			parameters.add(criteria.getHastaVigencia());
		} else {
			if (!criteria.getDesdeVigencia().equals("")) {
				query.append(" AND bot.FECHA_CREA >= TO_DATE(?,'DD/MM/RRRR')) ");
				parameters.add(criteria.getDesdeVigencia());
			} else {
				if (!criteria.getHastaVigencia().equals("")) {
					query.append(" AND bot.FECHA_CREA <= TO_DATE(?,'DD/MM/RRRR')) ");
					parameters.add(criteria.getHastaVigencia());
				} else {
					query.append(") ");
				}
			}
		}

		if ((Object) criteria.getCodeSubPrograma() != null) {
			query.append(" AND sub.CODIGO = ? ");
			parameters.add(criteria.getCodeSubPrograma());
		}
		if ((Object) criteria.getCodePrograma() != null) {
			query.append(" AND prog.CODIGO = ? ");
			parameters.add(criteria.getCodePrograma());
		}
		query.append(" ORDER BY area.NOMBRE, prog.NOMBRE");

		int iContSecr = 0;
		String strAntSecr = "";
		int iContProg = 0;
		String strAntProg = "";
		int iContBen = 0;
		int iContCant = 0;

		ArrayList<AuditoriaVO> report = new ArrayList<AuditoriaVO>();
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				AuditoriaVO objAuditoriaVO = new AuditoriaVO();
				objAuditoriaVO.setColumna1(rst.getString("SECRETARIA"));
				objAuditoriaVO.setColumna2(rst.getString("NOMPRO"));
				objAuditoriaVO.setColumna3(rst.getString("NOMSUB"));
				objAuditoriaVO.setColumna4(rst.getString("CANTIDAD"));

				if (!strAntSecr.equals(rst.getString("SECRETARIA")))
					iContSecr += 1;
				if (!strAntProg.equals(rst.getString("NOMPRO")))
					iContProg += 1;
				iContBen += 1;
				iContCant += rst.getInt("CANTIDAD");
				strAntSecr = rst.getString("SECRETARIA");
				strAntProg = rst.getString("NOMPRO");

				report.add(objAuditoriaVO);
			}
			if (iContCant != 0 && iContBen != 0) {
				AuditoriaVO objAuditoriaVO = new AuditoriaVO();
				objAuditoriaVO.setColumna1("TOTAL:");
				objAuditoriaVO.setColumna2("TOTAL:");
				objAuditoriaVO.setColumna3("TOTAL:");
				objAuditoriaVO.setColumna4("TOTAL:");
				report.add(objAuditoriaVO);

				objAuditoriaVO = new AuditoriaVO();
				objAuditoriaVO.setColumna1(formatoNumerico.format(iContSecr));
				objAuditoriaVO.setColumna2(formatoNumerico.format(iContProg));
				objAuditoriaVO.setColumna3(formatoNumerico.format(iContBen));
				objAuditoriaVO.setColumna4(formatoNumerico.format(iContCant));
				report.add(objAuditoriaVO);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return report;
	}

	public String findDescriptionUser(String strNumberDocument)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strDescription = null;
		String query = "SELECT descripcion FROM paoyer.tcs_usuario "
				+ "WHERE nombre = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, strNumberDocument);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				strDescription = rst.getString("descripcion");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return strDescription;
	}

}
